{
  "bundles": [
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-platform-login-shibboleth",
      "artifactVersion": "2021.24.3",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "org.nuxeo.ecm.platform.login",
          "org.nuxeo.ecm.platform.login.cas2",
          "org.nuxeo.ecm.platform.login.digest",
          "org.nuxeo.ecm.platform.login.shibboleth",
          "org.nuxeo.ecm.platform.login.token",
          "org.nuxeo.ecm.platform.login.token.jsf"
        ],
        "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login",
        "id": "grp:org.nuxeo.ecm.platform.login",
        "name": "org.nuxeo.ecm.platform.login",
        "parentIds": [
          "grp:org.nuxeo.ecm.platform"
        ],
        "readmes": [],
        "version": "2021.24"
      },
      "bundleId": "org.nuxeo.ecm.platform.login.shibboleth",
      "components": [
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.schema.TypeService--schema",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.type/Contributions/org.nuxeo.ecm.platform.login.shibboleth.type--schema",
              "id": "org.nuxeo.ecm.platform.login.shibboleth.type--schema",
              "registrationOrder": 20,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.schema.TypeService",
                "name": "org.nuxeo.ecm.core.schema.TypeService",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"schema\" target=\"org.nuxeo.ecm.core.schema.TypeService\">\n    <schema name=\"shibbolethGroup\" src=\"schema/shibb-group.xsd\"/>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.directory.GenericDirectory--directories",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.type/Contributions/org.nuxeo.ecm.platform.login.shibboleth.type--directories",
              "id": "org.nuxeo.ecm.platform.login.shibboleth.type--directories",
              "registrationOrder": 7,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.directory.GenericDirectory",
                "name": "org.nuxeo.ecm.directory.GenericDirectory",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"directories\" target=\"org.nuxeo.ecm.directory.GenericDirectory\">\n\n    <directory extends=\"template-directory\" name=\"shibbGroup\">\n      <schema>shibbolethGroup</schema>\n      <idField>groupName</idField>\n      <types>\n        <type>system</type>\n      </types>\n    </directory>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.schema.TypeService--doctype",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.type/Contributions/org.nuxeo.ecm.platform.login.shibboleth.type--doctype",
              "id": "org.nuxeo.ecm.platform.login.shibboleth.type--doctype",
              "registrationOrder": 19,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.schema.TypeService",
                "name": "org.nuxeo.ecm.core.schema.TypeService",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"doctype\" target=\"org.nuxeo.ecm.core.schema.TypeService\">\n\n    <doctype extends=\"Document\" name=\"shibbGroup\">\n      <schema name=\"shibbolethGroup\"/>\n    </doctype>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.type",
          "name": "org.nuxeo.ecm.platform.login.shibboleth.type",
          "requirements": [],
          "resolutionOrder": 384,
          "services": [],
          "startOrder": 325,
          "version": "2021.24.3",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.platform.login.shibboleth.type\">\n\n  <extension target=\"org.nuxeo.ecm.core.schema.TypeService\"\n    point=\"schema\">\n    <schema name=\"shibbolethGroup\" src=\"schema/shibb-group.xsd\" />\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.directory.GenericDirectory\" point=\"directories\">\n\n    <directory name=\"shibbGroup\" extends=\"template-directory\">\n      <schema>shibbolethGroup</schema>\n      <idField>groupName</idField>\n      <types>\n        <type>system</type>\n      </types>\n    </directory>\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.core.schema.TypeService\"\n    point=\"doctype\">\n\n    <doctype name=\"shibbGroup\" extends=\"Document\">\n      <schema name=\"shibbolethGroup\" />\n    </doctype>\n  </extension>\n</component>\n",
          "xmlFileName": "/OSGI-INF/shibboleth-group-type-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl--computer",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.computedgroups/Contributions/org.nuxeo.ecm.platform.login.shibboleth.computedgroups--computer",
              "id": "org.nuxeo.ecm.platform.login.shibboleth.computedgroups--computer",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl",
                "name": "org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"computer\" target=\"org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl\">\n    <groupComputer name=\"shibbolethGroupComputer\">\n      <computer>org.nuxeo.ecm.platform.shibboleth.computedgroups.ShibbolethGroupComputer\n      </computer>\n    </groupComputer>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl--computerChain",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.computedgroups/Contributions/org.nuxeo.ecm.platform.login.shibboleth.computedgroups--computerChain",
              "id": "org.nuxeo.ecm.platform.login.shibboleth.computedgroups--computerChain",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl",
                "name": "org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"computerChain\" target=\"org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl\">\n    <groupComputerChain append=\"true\">\n      <computers>\n        <computer>shibbolethGroupComputer</computer>\n      </computers>\n    </groupComputerChain>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.computedgroups",
          "name": "org.nuxeo.ecm.platform.login.shibboleth.computedgroups",
          "requirements": [],
          "resolutionOrder": 385,
          "services": [],
          "startOrder": 324,
          "version": "2021.24.3",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.platform.login.shibboleth.computedgroups\">\n\n  <extension\n    target=\"org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl\"\n    point=\"computer\">\n    <groupComputer name=\"shibbolethGroupComputer\">\n      <computer>org.nuxeo.ecm.platform.shibboleth.computedgroups.ShibbolethGroupComputer\n      </computer>\n    </groupComputer>\n  </extension>\n\n  <extension\n    target=\"org.nuxeo.ecm.platform.computedgroups.ComputedGroupsServiceImpl\"\n    point=\"computerChain\">\n    <groupComputerChain append=\"true\">\n      <computers>\n        <computer>shibbolethGroupComputer</computer>\n      </computers>\n    </groupComputerChain>\n  </extension>\n</component>\n",
          "xmlFileName": "/OSGI-INF/shibboleth-computedgroups-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "componentClass": "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationServiceImpl",
          "documentation": "\n    The Shibboleth Authentication Service handles the configuration to use\n    when connecting to Shibboleth for the authentication in Nuxeo.\n\n    @author Quentin Lamerand (qlamerand@nuxeo.com)\n  \n",
          "documentationHtml": "<p>\nThe Shibboleth Authentication Service handles the configuration to use\nwhen connecting to Shibboleth for the authentication in Nuxeo.\n</p><p></p>",
          "extensionPoints": [
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService",
              "descriptors": [
                "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationConfig"
              ],
              "documentation": "\n      Hold configuration for the Shibboleth Authentication Service. Contains:\n      * the mapping between request headers and user fields\n      * which header is used as user Id depending of the chosen IdP\n      * the login / logout URLs for Shibboleth\n\n      A sample configuration could be:\n      <code>\n    <extension point=\"config\" target=\"org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService\">\n        <config headerEncoding=\"utf-8\">\n            <uidHeaders>\n                <uidHeader idpUrl=\"https://specific.idp\">differentUid</uidHeader>\n                <default>uid</default>\n            </uidHeaders>\n            <loginURL>https://host/Shibboleth.sso/WAYF</loginURL>\n            <logoutURL>https://host/Shibboleth.sso/Logout</logoutURL>\n            <fieldMapping header=\"uid\">username</fieldMapping>\n            <fieldMapping header=\"mail\">email</fieldMapping>\n        </config>\n    </extension>\n</code>\n",
              "documentationHtml": "<p>\nHold configuration for the Shibboleth Authentication Service. Contains:\n* the mapping between request headers and user fields\n* which header is used as user Id depending of the chosen IdP\n* the login / logout URLs for Shibboleth\n</p><p>\nA sample configuration could be:\n</p><p></p><pre><code>    &lt;extension point&#61;&#34;config&#34; target&#61;&#34;org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService&#34;&gt;\n        &lt;config headerEncoding&#61;&#34;utf-8&#34;&gt;\n            &lt;uidHeaders&gt;\n                &lt;uidHeader idpUrl&#61;&#34;https://specific.idp&#34;&gt;differentUid&lt;/uidHeader&gt;\n                &lt;default&gt;uid&lt;/default&gt;\n            &lt;/uidHeaders&gt;\n            &lt;loginURL&gt;https://host/Shibboleth.sso/WAYF&lt;/loginURL&gt;\n            &lt;logoutURL&gt;https://host/Shibboleth.sso/Logout&lt;/logoutURL&gt;\n            &lt;fieldMapping header&#61;&#34;uid&#34;&gt;username&lt;/fieldMapping&gt;\n            &lt;fieldMapping header&#61;&#34;mail&#34;&gt;email&lt;/fieldMapping&gt;\n        &lt;/config&gt;\n    &lt;/extension&gt;\n</code></pre><p></p>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService/ExtensionPoints/org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService--config",
              "id": "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService--config",
              "label": "config (org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService)",
              "name": "config",
              "version": "2021.24.3"
            }
          ],
          "extensions": [],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService",
          "name": "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService",
          "requirements": [],
          "resolutionOrder": 386,
          "services": [
            {
              "@type": "NXService",
              "componentId": "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService/Services/org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService",
              "id": "org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService",
              "overriden": false,
              "version": "2021.24.3"
            }
          ],
          "startOrder": 844,
          "version": "2021.24.3",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component\n  name=\"org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService\">\n\n  <documentation>\n    The Shibboleth Authentication Service handles the configuration to use\n    when connecting to Shibboleth for the authentication in Nuxeo.\n\n    @author Quentin Lamerand (qlamerand@nuxeo.com)\n  </documentation>\n\n  <service>\n    <provide\n      interface=\"org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService\" />\n  </service>\n\n  <implementation\n    class=\"org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationServiceImpl\" />\n\n  <extension-point name=\"config\">\n    <documentation>\n      Hold configuration for the Shibboleth Authentication Service. Contains:\n      * the mapping between request headers and user fields\n      * which header is used as user Id depending of the chosen IdP\n      * the login / logout URLs for Shibboleth\n\n      A sample configuration could be:\n      <code>\n        <extension\n          target=\"org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationService\"\n          point=\"config\">\n          <config headerEncoding=\"utf-8\">\n            <uidHeaders>\n              <uidHeader idpUrl=\"https://specific.idp\">differentUid</uidHeader>\n              <default>uid</default>\n            </uidHeaders>\n\n            <loginURL>https://host/Shibboleth.sso/WAYF</loginURL>\n            <logoutURL>https://host/Shibboleth.sso/Logout</logoutURL>\n\n            <fieldMapping header=\"uid\">username</fieldMapping>\n            <fieldMapping header=\"mail\">email</fieldMapping>\n          </config>\n        </extension>\n      </code>\n    </documentation>\n    <object\n      class=\"org.nuxeo.ecm.platform.shibboleth.service.ShibbolethAuthenticationConfig\" />\n  </extension-point>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/shibboleth-authentication-service.xml",
          "xmlPureComponent": false
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.ui.web.auth.service.PluggableAuthenticationService--authenticators",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.auth/Contributions/org.nuxeo.ecm.platform.login.shibboleth.auth--authenticators",
              "id": "org.nuxeo.ecm.platform.login.shibboleth.auth--authenticators",
              "registrationOrder": 3,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.ui.web.auth.service.PluggableAuthenticationService",
                "name": "org.nuxeo.ecm.platform.ui.web.auth.service.PluggableAuthenticationService",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"authenticators\" target=\"org.nuxeo.ecm.platform.ui.web.auth.service.PluggableAuthenticationService\">\n    <authenticationPlugin class=\"org.nuxeo.ecm.platform.shibboleth.auth.ShibbolethAuthenticationPlugin\" enabled=\"true\" name=\"SHIB_AUTH\">\n    </authenticationPlugin>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.login.shibboleth.auth",
          "name": "org.nuxeo.ecm.platform.login.shibboleth.auth",
          "requirements": [],
          "resolutionOrder": 387,
          "services": [],
          "startOrder": 323,
          "version": "2021.24.3",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.platform.login.shibboleth.auth\">\n\n  <extension\n    target=\"org.nuxeo.ecm.platform.ui.web.auth.service.PluggableAuthenticationService\"\n    point=\"authenticators\">\n    <authenticationPlugin name=\"SHIB_AUTH\" enabled=\"true\"\n      class=\"org.nuxeo.ecm.platform.shibboleth.auth.ShibbolethAuthenticationPlugin\">\n    </authenticationPlugin>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/shibboleth-authenticators-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingService--exceptionhandler",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.shibboleth.exceptionhandling/Contributions/org.nuxeo.ecm.platform.shibboleth.exceptionhandling--exceptionhandler",
              "id": "org.nuxeo.ecm.platform.shibboleth.exceptionhandling--exceptionhandler",
              "registrationOrder": 2,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingService",
                "name": "org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingService",
                "type": "service"
              },
              "version": "2021.24.3",
              "xml": "<extension point=\"exceptionhandler\" target=\"org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingService\">\n    <exceptionHandler class=\"org.nuxeo.ecm.platform.shibboleth.auth.exceptionhandling.ShibbolethSecurityExceptionHandler\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth/org.nuxeo.ecm.platform.shibboleth.exceptionhandling",
          "name": "org.nuxeo.ecm.platform.shibboleth.exceptionhandling",
          "requirements": [
            "org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingContrib"
          ],
          "resolutionOrder": 593,
          "services": [],
          "startOrder": 470,
          "version": "2021.24.3",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.platform.shibboleth.exceptionhandling\">\n\n  <require>org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingContrib\n  </require>\n\n  <extension\n    target=\"org.nuxeo.ecm.platform.web.common.exceptionhandling.service.ExceptionHandlingService\"\n    point=\"exceptionhandler\">\n    <exceptionHandler\n      class=\"org.nuxeo.ecm.platform.shibboleth.auth.exceptionhandling.ShibbolethSecurityExceptionHandler\" />\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/shibboleth-exception-handling-contrib.xml",
          "xmlPureComponent": true
        }
      ],
      "fileName": "nuxeo-platform-login-shibboleth-2021.24.3.jar",
      "groupId": "org.nuxeo.ecm.platform",
      "hierarchyPath": "/grp:org.nuxeo.ecm.platform/grp:org.nuxeo.ecm.platform.login/org.nuxeo.ecm.platform.login.shibboleth",
      "id": "org.nuxeo.ecm.platform.login.shibboleth",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nArchiver-Version: Plexus Archiver\r\nCreated-By: Apache Maven\r\nBuilt-By: root\r\nBuild-Jdk: 11.0.16\r\nBundle-ManifestVersion: 1\r\nBundle-Version: ${eclipseVersion}-r${buildNumber}\r\nBundle-Name: Nuxeo Shibboleth login module\r\nBundle-SymbolicName: org.nuxeo.ecm.platform.login.shibboleth;singleton\r\n :=true\r\nRequire-Bundle: org.nuxeo.ecm.platform.login, org.nuxeo.ecm.webapp.base\r\nNuxeo-Component: OSGI-INF/shibboleth-group-type-contrib.xml,OSGI-INF/s\r\n hibboleth-computedgroups-contrib.xml,OSGI-INF/shibboleth-authenticati\r\n on-service.xml,OSGI-INF/shibboleth-authenticators-contrib.xml,OSGI-IN\r\n F/shibboleth-exception-handling-contrib.xml\r\n\r\n",
      "maxResolutionOrder": 593,
      "minResolutionOrder": 384,
      "packages": [
        "shibboleth-authentication"
      ],
      "requirements": [
        "org.nuxeo.ecm.platform.login",
        "org.nuxeo.ecm.webapp.base"
      ],
      "version": "2021.24.3"
    },
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-usermapper",
      "artifactVersion": "2021.24.3",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "org.nuxeo.binary.metadata",
          "org.nuxeo.directory.mongodb",
          "org.nuxeo.dmk-adaptor",
          "org.nuxeo.ecm.audit.io",
          "org.nuxeo.ecm.default.config",
          "org.nuxeo.ecm.jwt",
          "org.nuxeo.ecm.permissions",
          "org.nuxeo.ecm.platform",
          "org.nuxeo.ecm.platform.api",
          "org.nuxeo.ecm.platform.collections.core",
          "org.nuxeo.ecm.platform.commandline.executor",
          "org.nuxeo.ecm.platform.convert",
          "org.nuxeo.ecm.platform.csv.export",
          "org.nuxeo.ecm.platform.dublincore",
          "org.nuxeo.ecm.platform.filemanager",
          "org.nuxeo.ecm.platform.htmlsanitizer",
          "org.nuxeo.ecm.platform.mail",
          "org.nuxeo.ecm.platform.oauth",
          "org.nuxeo.ecm.platform.oauth1",
          "org.nuxeo.ecm.platform.pdf",
          "org.nuxeo.ecm.platform.query.api",
          "org.nuxeo.ecm.platform.rendering",
          "org.nuxeo.ecm.platform.threed",
          "org.nuxeo.ecm.platform.thumbnail",
          "org.nuxeo.ecm.platform.types",
          "org.nuxeo.ecm.platform.url",
          "org.nuxeo.ecm.platform.usermanager",
          "org.nuxeo.ecm.quota",
          "org.nuxeo.ecm.webdav",
          "org.nuxeo.importer.stream",
          "org.nuxeo.mail",
          "org.nuxeo.mongodb.audit",
          "org.nuxeo.search.ui",
          "org.nuxeo.usermapper"
        ],
        "hierarchyPath": "/grp:org.nuxeo.ecm.platform",
        "id": "grp:org.nuxeo.ecm.platform",
        "name": "org.nuxeo.ecm.platform",
        "parentIds": [],
        "readmes": [
          {
            "blobProviderId": "default",
            "content": "# Nuxeo Platform Importer\n\n## About Nuxeo Platform Importer\n\nThe file importer comes as a Java library (with nuxeo runtime service) and a sample JAX-RS interface to launch, monitor and abort import jobs.\nThis project is an on-going project, supported by Nuxeo\n\n## Building\n### How to Build Nuxeo Platform Importer\nBuild the Nuxeo Platform Importer with Maven:\n```$ mvn install -Dmaven.test.skip=true```\n\n## Deploying\nNuxeo Platform Importer is available as two package add-ons [from the Nuxeo Marketplace]\nhttps://connect.nuxeo.com/nuxeo/site/marketplace/package/nuxeo-platform-importer\nhttps://connect.nuxeo.com/nuxeo/site/marketplace/package/nuxeo-scan-importer\n\n## Resources\n### Documentation\nThe documentation for Nuxeo Platform Importer is available in our Documentation Center: http://doc.nuxeo.com/x/gYBVAQ\n\n### Reporting Issues\nYou can follow the developments in the Nuxeo Platform project of our JIRA bug tracker, which includes a Nuxeo Platform Importer component:\nhttps://jira.nuxeo.com/browse/NXP/component/10621\n\nYou can report issues on: http://answers.nuxeo.com/\n\n## About Nuxeo\nNuxeo dramatically improves how content-based applications are built, managed and deployed, making customers more agile, innovative and successful. Nuxeo provides a next generation, enterprise ready platform for building traditional and cutting-edge content oriented applications. Combining a powerful application development environment with SaaS-based tools and a modular architecture, the Nuxeo Platform and Products provide clear business value to some of the most recognizable brands including Verizon, Electronic Arts, Sharp, FICO, the U.S. Navy, and Boeing. Nuxeo is headquartered in New York and Paris. More information is available at www.nuxeo.com.\n",
            "digest": "83bb2a4c6415c9f07db3ab17fa99510c",
            "encoding": "UTF-8",
            "length": 1753,
            "mimeType": "text/plain",
            "name": "README.md"
          }
        ],
        "version": "2021.24"
      },
      "bundleId": "org.nuxeo.usermapper",
      "components": [
        {
          "@type": "NXComponent",
          "componentClass": "org.nuxeo.usermapper.service.UserMapperComponent",
          "documentation": "\n    This component expose a service to help mapping NuxeoPrincipal to\n    userObject provided by an external system.\n\n    The mapping itself is configurable using an extension point.\n\n    Typical use cases include :\n\n    <ul>\n    <li> SSO plugin that are able to do Just In Time provisioning </li>\n    <ul>\n        <li> SAML </li>\n        <li> Shibboleth </li>\n        <li> OpenId </li>\n        <li> Keyloack </li>\n    </ul>\n    <li> User provisioning API (such as SCIM) </li>\n</ul>\n",
          "documentationHtml": "<p>\nThis component expose a service to help mapping NuxeoPrincipal to\nuserObject provided by an external system.\n</p><p>\nThe mapping itself is configurable using an extension point.\n</p><p>\nTypical use cases include :\n</p><p>\n</p><ul><li> SSO plugin that are able to do Just In Time provisioning </li><li><ul><li> SAML </li><li> Shibboleth </li><li> OpenId </li><li> Keyloack </li></ul>\n</li><li> User provisioning API (such as SCIM) </li></ul>",
          "extensionPoints": [
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.usermapper.service.UserMapperComponent",
              "descriptors": [
                "org.nuxeo.usermapper.service.UserMapperDescriptor"
              ],
              "documentation": "\n      Allow to contribute mapper classes that will be responsible for\n      handling the mapping in 2 directions :\n\n      <ul>\n    <li> find and update NuxeoPrincipal given a userObject coming from\n          the external system</li>\n    <li> create an external userObject from a NuxeoPrincipal</li>\n</ul>\n\n\n      Here is an example to contribute a custom class :\n      <code>\n    <mapper class=\"org.nuxeo.usermapper.test.dummy.DummyUserMapper\" name=\"javaDummy\">\n        <parameters>\n            <parameter name=\"param1\">value1</parameter>\n        </parameters>\n    </mapper>\n</code>\n\n\n      The contributed class has to implement the UserMapper interface.\n\n      You can also contribute the implementation via a Groovy or JavaScript.\n\n      In this case, simply omit the class attribute and add a script tag:\n\n      <code>\n    <mapper name=\"scim\" type=\"groovy\">\n        <mapperScript><![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n\n              String userId = userObject.getId();\n              if (userId == null || userId.isEmpty()) {\n                userId = userObject.getUserName();\n              }\n\n              searchAttributes.put(um.getUserIdField(), userId);\n\n              if (searchAttributes.containsKey(\"uid\")) {\n                userAttributes.put(um.getUserIdField(), searchAttributes.get(\"uid\"));\n              }\n\n              if (userObject.getEmails() != null && userObject.getEmails().size() > 0) {\n                userAttributes.put(\"email\",userObject.getEmails().iterator().next().getValue());\n              }\n              String displayName = userObject.getDisplayName();\n              if (displayName!=null && !displayName.isEmpty()) {\n                int idx = displayName.indexOf(\" \");\n                if (idx>0) {\n                    userAttributes.put(\"firstName\", displayName.substring(0, idx).trim());\n                    userAttributes.put(\"lastName\", displayName.substring(idx+1).trim());\n                } else {\n                    userAttributes.put(\"firstName\", displayName);\n                    userAttributes.put(\"lastName\", \"\");\n                }\n            }\n            ]]></mapperScript>\n        <wrapperScript><![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          import com.unboundid.scim.data.Entry;\n          import com.unboundid.scim.data.GroupResource;\n          import com.unboundid.scim.data.Meta;\n          import com.unboundid.scim.data.Name;\n          import com.unboundid.scim.data.UserResource;\n          import com.unboundid.scim.schema.CoreSchema;\n          import com.unboundid.scim.sdk.SCIMConstants;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n              DocumentModel userModel = nuxeoPrincipal.getModel();\n              String userId = (String) userModel.getProperty(um.getUserSchemaName(),\n                      um.getUserIdField());\n\n              String fname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"firstName\");\n              String lname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"lastName\");\n              String email = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"email\");\n              String company = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"company\");\n\n              String displayName = fname + \" \" + lname;\n              displayName = displayName.trim();\n              userObject.setDisplayName(displayName);\n              Collection<Entry<String>> emails = new ArrayList<>();\n              if (email!=null) {\n                  emails.add(new Entry<String>(email, \"string\"));\n                  userObject.setEmails(emails);\n              }\n\n              Name fullName = new Name(displayName, lname, \"\", fname, \"\", \"\");\n              userObject.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE,\n                      \"name\", Name.NAME_RESOLVER, fullName);\n\n              // manage groups\n              List<String> groupIds = um.getPrincipal(userId).getAllGroups();\n              Collection<Entry<String>> groups = new ArrayList<>();\n              for (String groupId : groupIds) {\n                  groups.add(new Entry<String>(groupId, \"string\"));\n              }\n              userObject.setGroups(groups);\n\n              userObject.setActive(true);\n            ]]></wrapperScript>\n    </mapper>\n    <mapper name=\"jsDummy\" type=\"js\">\n        <mapperScript>\n              searchAttributes.put(\"username\", userObject.login);\n              userAttributes.put(\"firstName\", userObject.name.firstName);\n              userAttributes.put(\"lastName\", userObject.name.lastName);\n              profileAttributes.put(\"userprofile:phonenumber\", \"555.666.7777\");\n          </mapperScript>\n    </mapper>\n</code>\n\n\n      In the script context for mapping userObject to NuxeoPrincipal :\n      <ul>\n    <li>\n          userObject : represent the object passed to the\n          <pre>getCreateOrUpdateNuxeoPrincipal</pre>\n          method\n        </li>\n    <li> searchAttributes : is the Map&lt;String,String&gt; that will be used\n          to search the NuxeoPrincipal</li>\n    <li> userAttributes : is the Map&lt;String,String&gt; that will be used\n          to create/update the NuxeoPrincipal</li>\n    <li> profileAttribute : is the Map&lt;String,String&gt; that will be used\n          to update the user's profile</li>\n</ul>\n\n\n\n      In the script context for wrapping a NuxeoPrincipal into a userObject :\n      <ul>\n    <li>\n          userObject : represent the userObject as initialized by the caller code\n        </li>\n    <li> nuxeoPrincipal : is the principal to wrap</li>\n    <li> params : is the Map&lt;String,Serializable&gt; passed by the caller</li>\n</ul>\n",
              "documentationHtml": "<p>\nAllow to contribute mapper classes that will be responsible for\nhandling the mapping in 2 directions :\n</p><p>\n</p><ul><li> find and update NuxeoPrincipal given a userObject coming from\nthe external system</li><li> create an external userObject from a NuxeoPrincipal</li></ul>\n<p>\nHere is an example to contribute a custom class :\n</p><p></p><pre><code>    &lt;mapper class&#61;&#34;org.nuxeo.usermapper.test.dummy.DummyUserMapper&#34; name&#61;&#34;javaDummy&#34;&gt;\n        &lt;parameters&gt;\n            &lt;parameter name&#61;&#34;param1&#34;&gt;value1&lt;/parameter&gt;\n        &lt;/parameters&gt;\n    &lt;/mapper&gt;\n</code></pre><p>\nThe contributed class has to implement the UserMapper interface.\n</p><p>\nYou can also contribute the implementation via a Groovy or JavaScript.\n</p><p>\nIn this case, simply omit the class attribute and add a script tag:\n</p><p>\n</p><pre><code>    &lt;mapper name&#61;&#34;scim&#34; type&#61;&#34;groovy&#34;&gt;\n        &lt;mapperScript&gt;&lt;![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n              UserManager um &#61; Framework.getLocalService(UserManager.class);\n\n              String userId &#61; userObject.getId();\n              if (userId &#61;&#61; null || userId.isEmpty()) {\n                userId &#61; userObject.getUserName();\n              }\n\n              searchAttributes.put(um.getUserIdField(), userId);\n\n              if (searchAttributes.containsKey(&#34;uid&#34;)) {\n                userAttributes.put(um.getUserIdField(), searchAttributes.get(&#34;uid&#34;));\n              }\n\n              if (userObject.getEmails() !&#61; null &amp;&amp; userObject.getEmails().size() &gt; 0) {\n                userAttributes.put(&#34;email&#34;,userObject.getEmails().iterator().next().getValue());\n              }\n              String displayName &#61; userObject.getDisplayName();\n              if (displayName!&#61;null &amp;&amp; !displayName.isEmpty()) {\n                int idx &#61; displayName.indexOf(&#34; &#34;);\n                if (idx&gt;0) {\n                    userAttributes.put(&#34;firstName&#34;, displayName.substring(0, idx).trim());\n                    userAttributes.put(&#34;lastName&#34;, displayName.substring(idx&#43;1).trim());\n                } else {\n                    userAttributes.put(&#34;firstName&#34;, displayName);\n                    userAttributes.put(&#34;lastName&#34;, &#34;&#34;);\n                }\n            }\n            ]]&gt;&lt;/mapperScript&gt;\n        &lt;wrapperScript&gt;&lt;![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          import com.unboundid.scim.data.Entry;\n          import com.unboundid.scim.data.GroupResource;\n          import com.unboundid.scim.data.Meta;\n          import com.unboundid.scim.data.Name;\n          import com.unboundid.scim.data.UserResource;\n          import com.unboundid.scim.schema.CoreSchema;\n          import com.unboundid.scim.sdk.SCIMConstants;\n\n              UserManager um &#61; Framework.getLocalService(UserManager.class);\n              DocumentModel userModel &#61; nuxeoPrincipal.getModel();\n              String userId &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      um.getUserIdField());\n\n              String fname &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;firstName&#34;);\n              String lname &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;lastName&#34;);\n              String email &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;email&#34;);\n              String company &#61; (String) userModel.getProperty(um.getUserSchemaName(),\n                      &#34;company&#34;);\n\n              String displayName &#61; fname &#43; &#34; &#34; &#43; lname;\n              displayName &#61; displayName.trim();\n              userObject.setDisplayName(displayName);\n              Collection&lt;Entry&lt;String&gt;&gt; emails &#61; new ArrayList&lt;&gt;();\n              if (email!&#61;null) {\n                  emails.add(new Entry&lt;String&gt;(email, &#34;string&#34;));\n                  userObject.setEmails(emails);\n              }\n\n              Name fullName &#61; new Name(displayName, lname, &#34;&#34;, fname, &#34;&#34;, &#34;&#34;);\n              userObject.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE,\n                      &#34;name&#34;, Name.NAME_RESOLVER, fullName);\n\n              // manage groups\n              List&lt;String&gt; groupIds &#61; um.getPrincipal(userId).getAllGroups();\n              Collection&lt;Entry&lt;String&gt;&gt; groups &#61; new ArrayList&lt;&gt;();\n              for (String groupId : groupIds) {\n                  groups.add(new Entry&lt;String&gt;(groupId, &#34;string&#34;));\n              }\n              userObject.setGroups(groups);\n\n              userObject.setActive(true);\n            ]]&gt;&lt;/wrapperScript&gt;\n    &lt;/mapper&gt;\n    &lt;mapper name&#61;&#34;jsDummy&#34; type&#61;&#34;js&#34;&gt;\n        &lt;mapperScript&gt;\n              searchAttributes.put(&#34;username&#34;, userObject.login);\n              userAttributes.put(&#34;firstName&#34;, userObject.name.firstName);\n              userAttributes.put(&#34;lastName&#34;, userObject.name.lastName);\n              profileAttributes.put(&#34;userprofile:phonenumber&#34;, &#34;555.666.7777&#34;);\n          &lt;/mapperScript&gt;\n    &lt;/mapper&gt;\n</code></pre><p>\nIn the script context for mapping userObject to NuxeoPrincipal :\n</p><ul><li>\nuserObject : represent the object passed to the\n<pre>getCreateOrUpdateNuxeoPrincipal</pre>\nmethod\n</li><li> searchAttributes : is the Map&lt;String,String&gt; that will be used\nto search the NuxeoPrincipal</li><li> userAttributes : is the Map&lt;String,String&gt; that will be used\nto create/update the NuxeoPrincipal</li><li> profileAttribute : is the Map&lt;String,String&gt; that will be used\nto update the user&#39;s profile</li></ul>\n<p>\nIn the script context for wrapping a NuxeoPrincipal into a userObject :\n</p><ul><li>\nuserObject : represent the userObject as initialized by the caller code\n</li><li> nuxeoPrincipal : is the principal to wrap</li><li> params : is the Map&lt;String,Serializable&gt; passed by the caller</li></ul>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper/org.nuxeo.usermapper.service.UserMapperComponent/ExtensionPoints/org.nuxeo.usermapper.service.UserMapperComponent--mapper",
              "id": "org.nuxeo.usermapper.service.UserMapperComponent--mapper",
              "label": "mapper (org.nuxeo.usermapper.service.UserMapperComponent)",
              "name": "mapper",
              "version": "2021.24.3"
            }
          ],
          "extensions": [],
          "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper/org.nuxeo.usermapper.service.UserMapperComponent",
          "name": "org.nuxeo.usermapper.service.UserMapperComponent",
          "requirements": [
            "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent"
          ],
          "resolutionOrder": 883,
          "services": [
            {
              "@type": "NXService",
              "componentId": "org.nuxeo.usermapper.service.UserMapperComponent",
              "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper/org.nuxeo.usermapper.service.UserMapperComponent/Services/org.nuxeo.usermapper.service.UserMapperService",
              "id": "org.nuxeo.usermapper.service.UserMapperService",
              "overriden": false,
              "version": "2021.24.3"
            }
          ],
          "startOrder": 902,
          "version": "2021.24.3",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n\n<component name=\"org.nuxeo.usermapper.service.UserMapperComponent\"\n  version=\"1.0\">\n\n  <implementation class=\"org.nuxeo.usermapper.service.UserMapperComponent\" />\n\n  <service>\n    <provide interface=\"org.nuxeo.usermapper.service.UserMapperService\" />\n  </service>\n\n  <require>org.nuxeo.automation.scripting.internals.AutomationScriptingComponent</require>\n\n  <documentation>\n    This component expose a service to help mapping NuxeoPrincipal to\n    userObject provided by an external system.\n\n    The mapping itself is configurable using an extension point.\n\n    Typical use cases include :\n\n    <ul>\n      <li> SSO plugin that are able to do Just In Time provisioning </li>\n      <ul>\n        <li> SAML </li>\n        <li> Shibboleth </li>\n        <li> OpenId </li>\n        <li> Keyloack </li>\n      </ul>\n      <li> User provisioning API (such as SCIM) </li>\n    </ul>\n  </documentation>\n\n\n  <extension-point name=\"mapper\">\n    <documentation>\n      Allow to contribute mapper classes that will be responsible for\n      handling the mapping in 2 directions :\n\n      <ul>\n        <li> find and update NuxeoPrincipal given a userObject coming from\n          the external system</li>\n        <li> create an external userObject from a NuxeoPrincipal</li>\n      </ul>\n\n      Here is an example to contribute a custom class :\n      <code>\n\n        <mapper name=\"javaDummy\"\n          class=\"org.nuxeo.usermapper.test.dummy.DummyUserMapper\">\n          <parameters>\n            <parameter name=\"param1\">value1</parameter>\n          </parameters>\n        </mapper>\n\n      </code>\n\n      The contributed class has to implement the UserMapper interface.\n\n      You can also contribute the implementation via a Groovy or JavaScript.\n\n      In this case, simply omit the class attribute and add a script tag:\n\n      <code>\n\n        <mapper name=\"scim\" type=\"groovy\">\n          <mapperScript>\n              <![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n\n              String userId = userObject.getId();\n              if (userId == null || userId.isEmpty()) {\n                userId = userObject.getUserName();\n              }\n\n              searchAttributes.put(um.getUserIdField(), userId);\n\n              if (searchAttributes.containsKey(\"uid\")) {\n                userAttributes.put(um.getUserIdField(), searchAttributes.get(\"uid\"));\n              }\n\n              if (userObject.getEmails() != null && userObject.getEmails().size() > 0) {\n                userAttributes.put(\"email\",userObject.getEmails().iterator().next().getValue());\n              }\n              String displayName = userObject.getDisplayName();\n              if (displayName!=null && !displayName.isEmpty()) {\n                int idx = displayName.indexOf(\" \");\n                if (idx>0) {\n                    userAttributes.put(\"firstName\", displayName.substring(0, idx).trim());\n                    userAttributes.put(\"lastName\", displayName.substring(idx+1).trim());\n                } else {\n                    userAttributes.put(\"firstName\", displayName);\n                    userAttributes.put(\"lastName\", \"\");\n                }\n            }\n            ]]>\n              </mapperScript>\n\n        <wrapperScript>\n              <![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          import com.unboundid.scim.data.Entry;\n          import com.unboundid.scim.data.GroupResource;\n          import com.unboundid.scim.data.Meta;\n          import com.unboundid.scim.data.Name;\n          import com.unboundid.scim.data.UserResource;\n          import com.unboundid.scim.schema.CoreSchema;\n          import com.unboundid.scim.sdk.SCIMConstants;\n\n              UserManager um = Framework.getLocalService(UserManager.class);\n              DocumentModel userModel = nuxeoPrincipal.getModel();\n              String userId = (String) userModel.getProperty(um.getUserSchemaName(),\n                      um.getUserIdField());\n\n              String fname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"firstName\");\n              String lname = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"lastName\");\n              String email = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"email\");\n              String company = (String) userModel.getProperty(um.getUserSchemaName(),\n                      \"company\");\n\n              String displayName = fname + \" \" + lname;\n              displayName = displayName.trim();\n              userObject.setDisplayName(displayName);\n              Collection<Entry<String>> emails = new ArrayList<>();\n              if (email!=null) {\n                  emails.add(new Entry<String>(email, \"string\"));\n                  userObject.setEmails(emails);\n              }\n\n              Name fullName = new Name(displayName, lname, \"\", fname, \"\", \"\");\n              userObject.setSingularAttributeValue(SCIMConstants.SCHEMA_URI_CORE,\n                      \"name\", Name.NAME_RESOLVER, fullName);\n\n              // manage groups\n              List<String> groupIds = um.getPrincipal(userId).getAllGroups();\n              Collection<Entry<String>> groups = new ArrayList<>();\n              for (String groupId : groupIds) {\n                  groups.add(new Entry<String>(groupId, \"string\"));\n              }\n              userObject.setGroups(groups);\n\n              userObject.setActive(true);\n            ]]>\n        </wrapperScript>\n    </mapper>\n\n\n    <mapper name=\"jsDummy\" type=\"js\">\n          <mapperScript>\n              searchAttributes.put(\"username\", userObject.login);\n              userAttributes.put(\"firstName\", userObject.name.firstName);\n              userAttributes.put(\"lastName\", userObject.name.lastName);\n              profileAttributes.put(\"userprofile:phonenumber\", \"555.666.7777\");\n          </mapperScript>\n      </mapper>\n\n    </code>\n\n      In the script context for mapping userObject to NuxeoPrincipal :\n      <ul>\n        <li>\n          userObject : represent the object passed to the\n          <pre>getCreateOrUpdateNuxeoPrincipal</pre>\n          method\n        </li>\n        <li> searchAttributes : is the Map&lt;String,String&gt; that will be used\n          to search the NuxeoPrincipal</li>\n        <li> userAttributes : is the Map&lt;String,String&gt; that will be used\n          to create/update the NuxeoPrincipal</li>\n        <li> profileAttribute : is the Map&lt;String,String&gt; that will be used\n          to update the user's profile</li>\n\n      </ul>\n\n\n      In the script context for wrapping a NuxeoPrincipal into a userObject :\n      <ul>\n        <li>\n          userObject : represent the userObject as initialized by the caller code\n        </li>\n        <li> nuxeoPrincipal : is the principal to wrap</li>\n        <li> params : is the Map&lt;String,Serializable&gt; passed by the caller</li>\n      </ul>\n\n    </documentation>\n\n    <object class=\"org.nuxeo.usermapper.service.UserMapperDescriptor\" />\n  </extension-point>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/usermapper-service.xml",
          "xmlPureComponent": false
        }
      ],
      "fileName": "nuxeo-usermapper-2021.24.3.jar",
      "groupId": "org.nuxeo.ecm.platform",
      "hierarchyPath": "/grp:org.nuxeo.ecm.platform/org.nuxeo.usermapper",
      "id": "org.nuxeo.usermapper",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nArchiver-Version: Plexus Archiver\r\nCreated-By: Apache Maven\r\nBuilt-By: root\r\nBuild-Jdk: 11.0.16\r\nBundle-ManifestVersion: 2\r\nBundle-Version: 2021.24.3-t20220801-192809\r\nBundle-Vendor: Nuxeo\r\nBundle-ActivationPolicy: lazy\r\nBundle-ClassPath: .\r\nBundle-Name: org.nuxeo.usermapper\r\nNuxeo-Component: OSGI-INF/usermapper-service.xml\r\nBundle-SymbolicName: org.nuxeo.usermapper\r\n\r\n",
      "maxResolutionOrder": 883,
      "minResolutionOrder": 883,
      "packages": [
        "shibboleth-authentication"
      ],
      "readme": {
        "blobProviderId": "default",
        "content": "nuxeo-usermapper\n==========================\n\n## Principles\n\n### Use cases\n\nWe currently have several places where we need to Create/Update a Nuxeo User (and possibly groups) from data provided by an external system.\n\nThis can typically be :\n\n - an Authentication plugin that handles Just In Time user provisioning\n     - Shibboleth\n     - SAML\n     - OpenId\n     - Jboss Keycloak\n - a provisioning API like [SCIM](http://www.simplecloud.info/)\n\nThe goal of this module is double :\n\n - avoid duplicated code in several modules\n - make the mapping pluggable\n\n### UserMapper Service\n\n#### Configurable mapping\n\nOf course, we need the mapping to be configurable, but unfortunately, the source object is different depending on the source : SAML user, Shibboleth user, SCIM user.\n\nIdeally, we would like to rely on a key value system (i.e. see user and group as a Map) with simple mapping, but :\n\n - SCIM Model is more complex than simple Key/Value\n - some time we need to compute some attributes (like : FullName = FirstName + LastName)\n\nFor this reason, the mapping can be contributed :\n\n - as a Java Class\n - as Groovy Scriptlets\n - as JavaScript\n\n#### 2 Ways mapping\n\nAt least for SCIM use cases, the Service needs to handle 2 ways :\n\n     NuxeoPrincipal getOrCreateAndUpdateNuxeoPrincipal(Object userObject, boolean createIfNeeded, boolean update,\n            Map<String, Serializable> params);\n\nThis API will be used to create / update a Nuxeo Principal based on SCIM user object.\n\n     Object wrapNuxeoPrincipal(NuxeoPrincipal principal, Object nativePrincipal, Map<String, Serializable> params);\n\nGet the SCIM representation of a Nuxeo User.\n\n#### Contributing new mapping\n\nThe component expose a `mapper` extension point that can be used to contribute new mappers.\n\nUsing plain Java Code :\n\n    <mapper name=\"javaDummy\" class=\"org.nuxeo.usermapper.test.dummy.DummyUserMapper\">\n       <parameters>\n         <param name=\"param1\">value1</param>\n       </parameters>\n    </mapper>\n\nUsing Groovy Scriptlet :\n\n    <mapper name=\"scim\" type=\"groovy\">\n      <mapperScript>\n      <![CDATA[\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          UserManager um = Framework.getLocalService(UserManager.class);\n\n          String userId = userObject.getId();\n          if (userId == null || userId.isEmpty()) {\n            userId = userObject.getUserName();\n          }\n          ...\n        ]]>\n      </mapperScript>\n\n      <wrapperScript>\n        <![CDATA[\n          import org.nuxeo.ecm.core.api.DocumentModel;\n          import org.nuxeo.ecm.core.api.NuxeoException;\n          import org.nuxeo.ecm.platform.usermanager.UserManager;\n          import org.nuxeo.runtime.api.Framework;\n\n          UserManager um = Framework.getLocalService(UserManager.class);\n          DocumentModel userModel = nuxeoPrincipal.getModel();\n          ...\n        ]]>\n      </wrapperScript>\n    </mapper>\n\nUsing JavaScript :\n\n    <mapper name=\"jsDummy\" type=\"js\">\n      <mapperScript>\n          searchAttributes.put(\"username\", userObject.login);\n          userAttributes.put(\"firstName\", userObject.name.firstName);\n          userAttributes.put(\"lastName\", userObject.name.lastName);\n          profileAttributes.put(\"userprofile:phonenumber\", \"555.666.7777\");\n       </mapperScript>\n     </mapper>\n\n**mapperScript**\n\nIn the script context for mapping userObject to NuxeoPrincipal (i.e. `mapperScript` tag corresponding to the `getOrCreateAndUpdateNuxeoPrincipal`)\n\n - userObject : represent the object passed to the\n - searchAttributes : is the Map&lt;String, String&gt; that will be used to search the NuxeoPrincipal\n - userAttributes : is the Map&lt;String, String&gt; that will be used to create/update the NuxeoPrincipal\n - profileAttribute : is the Map&lt;String, String&gt; that will be used to update the user's profile\n\n**wrapperScript**\n\nIn the script context for wrapping a NuxeoPrincipal into a userObject (i.e. `wrapperScript` tag corresponding to the `wrapNuxeoPrincipal` method) :\n\n - userObject : represent the userObject as initialized by the caller code\n - nuxeoPrincipal : is the principal to wrap\n - params : is the Map&lt;String, Serializable&gt; passed by the caller\n\n## Building / Install\n\nBuild :\n\n    mvn clean install\n",
        "digest": "a9fa9b9511a5fc874e0f9c2f04cd236a",
        "encoding": "UTF-8",
        "length": 4284,
        "mimeType": "text/plain",
        "name": "README.md"
      },
      "requirements": [],
      "version": "2021.24.3"
    }
  ],
  "creationDate": 1664794327924,
  "key": "Nuxeo Platform-2021.24",
  "name": "Nuxeo Platform",
  "operations": [],
  "packages": [
    {
      "@type": "NXPackage",
      "bundles": [
        "org.nuxeo.ecm.platform.login.shibboleth",
        "org.nuxeo.usermapper"
      ],
      "conflicts": [],
      "dependencies": [],
      "hierarchyPath": "/shibboleth-authentication-2021.24.3",
      "id": "shibboleth-authentication-2021.24.3",
      "name": "shibboleth-authentication",
      "optionalDependencies": [],
      "packageType": "addon",
      "title": "Shibboleth Authentication",
      "version": "2021.24.3"
    }
  ],
  "pluginSnapshots": {},
  "releaseDate": 1664794327924,
  "version": "2021.24"
}